EchoDemo's Blogs

LintCode A + B 问题

给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。

你不需要从输入流读入数据,只需要根据aplusb的两个参数a和b,计算他们的和并返回就行。

注意:a和b都是32位整数

样例:如果 a=1 并且 b=2,返回3

分析:对于这道题以我浅薄的知识真的是没想出来(发现这是一道简单题,瞬间受到一万点伤害),这种接近于底层的东西,感觉自己在这方面太匮乏了。题目要求不能使用算术运算符号,基本上就能想到是通过二进制的位运算进行解答。但是想了半天也没什么头绪,只能默默地搜一下了。发现还是这篇文章讲得最靠谱了。lintcode刷题A+B问题位运算

然后突然想起自己的左移和右移有点淡忘了,就复习一下。移位包括逻辑移位和算术移位。逻辑移位是指移出去的位丢弃,空缺位用0来填充;算术移位是指移出去的位丢弃,空缺位用符号位来填充。当然对于无符号数来说,不管是左移还是右移都是逻辑移位;而对于有符号数而言,如果是左移则仍然是逻辑移位,但如果是右移则属于算术移位。

题目代码:比起oj里面的lintcode答案,还是比较喜欢上条链接里大佬写的代码,嘻嘻!

class Solution {
public:
    /**
     * @param a: An integer
     * @param b: An integer
     * @return: The sum of a and b 
     */
    int aplusb(int a, int b) {
        // write your code here
        if(a==0) return b;
        if(b==0) return a;
        int x1=(a&b)<<1;
        int x2=a^b;
        return aplusb(x1,x2);
    }
};



🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------